#pragma once
#include <iostream>
#include <memory>
#include <unistd.h>
#include "Socket.hpp"

using namespace SocketModule;

class SelectServer
{
    const static int size = sizeof(fd_set) * 8;
    const static int defaultfd = -1;

    public:
    SelectServer(int port)
    :_listensock(std::make_unique<TcpSocket>()),
     _isrunning(false)
    {
        _listensock->BuildTcpSocketMethod(port);

    }

    void Start()
    {
        _isrunning = true;
        while(_isrunning)
        {
            //首先解决 listen套接字，因为在等待新链接到来时，也是会阻塞的 

            // 因为: listensockfd,也是一个fd，进程怎么知道listenfd上面有新连接到来了呢？
            // auto res = _listensock->Accept(); // 我们在select这里，可以进行accept吗？
            // 将listensockfd添加到select内部，让OS帮我关心listensockfd上面的读事件

            // 定义fds集合
            fd_set rfds;
            // 清空fds
            FD_ZERO(&rfds);
            // 有没有设置到内核中？1 or 0  0
            FD_SET(_listensock->Fd(), &rfds);

            select(_listensock->Fd(), &rfds, nullptr, nullptr, nullptr);
        }
        _isrunning = false;
    }

    void Stop()
    {
        _isrunning = false;
    }

    private:
    std::unique_ptr<Socket> _listensock;
    bool _isrunning;
    //用一个数组来代替 
    int fd_arrry[size];
};
